/*
 * Sequence.h
 *
 *  Created on: Oct 28, 2013
 *      Author: m
 */

#ifndef SEQUENCE_H_
#define SEQUENCE_H_

#include "SharedMemory.h"
#include "Semaphore.h"

namespace ipc
{

typedef unsigned long snumber_t;

using ipc::Semaphore;
using ipc::SharedMemory;

/**
 * Secuencia numerada que comienza en 1
 */
class Sequence
{
private:
    Semaphore m_mutex;
    SharedMemory<snumber_t> m_currentValue;

    /**
     * Constructor (privado)
     *
     * @param file Archivo Base
     * @param charKey Caracter para usar de clave
     */
    Sequence( std::string file, char charKey );

public:

    /**
     * Destructor
     */
    virtual ~Sequence();

    /**
     * Devuelve siguiente numero de la secuencia y la incrementa en uno.
     *
     * @return Siguiente numero de la secuencia
     */
    int getNext();

    /**
     * Crea (e inicializa) la secuencia
     *
     * @param file Archivo Base
     * @param charKey Caracter para usar de clave
     *
     * @return La Secuencia
     */
    static Sequence create( std::string file, char charKey );

    /**
     * Metodo para obtener una Secuencia (ya creada)
     *
     * @param file Archivo base
     * @param charKey Caracter para usar como clave
     *
     * @return La Secuencia
     */
    static Sequence get( std::string file, char charKey );

    /**
     * Destruye la secuencia.
     *
     * @param file Archivo Base
     * @param charKey Caracter para usar de clave
     */
    static void destroy( std::string file, char charKey );
};

} /* namespace ipc */
#endif /* SEQUENCE_H_ */
